% 1. 定义取餐时间和满意度数据点
t = [0, 10, 15, 19, 20, 25, 30, 31, 35, 40, 45, 50];  % 取餐时间(分钟)
s = [60, 85, 95, 99, 100, 100, 100, 94, 80, 55, 25, 0]; % 满意度(%)

% 2. 创建分段函数模型
model = @(b, t) arrayfun(@(x) piecewise_satisfaction(b, x), t);

function val = piecewise_satisfaction(b, x)
    if x < 20
        val = b(1)*x + b(2);  % 提前取餐段(线性)
    elseif x >= 20 && x <= 30
        val = 100;  % 准时取餐段(常数)
    else
        val = b(3)*x.^2 + b(4)*x + b(5);  % 推迟取餐段(二次函数)
    end
end

% 3. 初始参数猜测
b0 = [1.5, 50, -0.1, -5, 250];

% 4. 非线性最小二乘拟合
stats = statset('Display', 'off');
b_fit = nlinfit(t', s', model, b0, stats);

% 5. 生成更密集的时间点用于绘制平滑曲线
t_fit = linspace(0, 60, 200);  % 0到60分钟，200个点
s_fit = model(b_fit, t_fit);

% 6. 绘制原始数据点和拟合曲线
figure('Color', 'white');
plot(t, s, 'ro', 'MarkerSize', 8, 'MarkerFaceColor', 'r', 'DisplayName', '数据点');
hold on;
plot(t_fit, s_fit, 'b-', 'LineWidth', 2, 'DisplayName', '拟合曲线');
hold off;

% 7. 添加图表标签和网格
xlabel('下单到取餐时间 (分钟)', 'FontSize', 12);
ylabel('满意度 (%)', 'FontSize', 12);
title('满意度与取餐时间的关系', 'FontSize', 14);
legend('show', 'Location', 'southeast');
grid on;
box on;

% 8. 设置中文显示（若需要）
set(gca, 'FontName', 'SimHei');